package org.jflame.commons.excel;

import org.jflame.commons.convert.Converter;
import org.jflame.commons.excel.convertor.NullConverter;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Excel列注解,描述需要写入excel的值属性,适用于csv文件.
 * 
 * @author zyc
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target({ ElementType.METHOD,ElementType.FIELD })
public @interface ExcelColumn {

    /**
     * 列名
     * 
     * @return
     */
    public String name();

    /**
     * 列顺序
     * 
     * @return
     */
    public int order();

    /**
     * 列行为类型
     * <ul>
     * <li>0=默认,数字和日期类型保持到对应POI {@link org.apache.poi.ss.usermodel.CellType}类型不变,其他类型转String</li>
     * <li>1=文本,所有类型都转String</li>
     * <li>2=公式,String适用</li>
     * </ul>
     * <p>
     * 注: Excel中数字长度&gt;11时自动显示为科学计数法,长度&gt;14时后面数字显示为0, 在columnType=0时,可设置fmt改变显示格式(如fmt="0").
     * columnType=1时当文本处理不存在这个问题
     * <p>
     * csv文件无效
     * 
     * @return
     */
    public int columnType() default 0;

    /**
     * 格式. 如果指定了Converter则该属性作为其构造函数参数, 如columnType=0且类型是数字或日期则作为CellStyle格式.
     * <p>
     * 注:写入csv文件时,如超11位的数字或纯数字文本,指定格式fmt="0"可避免打开时显示为科学计数法
     * 
     * @return
     */
    public String fmt() default "";

    /**
     * 列样式,使用类似css格式描述列样式. 具体实现参考:{@link CellCssStyle}. 示例:
     * <p>
     * 1. "fontName:Arial;fontStyle:'16 strikeout';align:center;bgColor:black;border:'dotted black'"<br>
     * 2. "width:20;fontName:'Arial Black';fontStyle:'red bold';border:'dotted #000000'"<br>
     * 注: width指字符个数
     * <p>
     * csv文件无效
     * 
     * @return
     */
    public String style() default "";

    /**
     * 分组,按属性分组写入数据
     * 
     * @return
     */
    public String[] group() default {};

    /**
     * 写入类型转换器,写入时统一转为string,设置写转换器后columnType=1
     * 
     * @return
     */
    @SuppressWarnings("rawtypes")
    public Class<? extends Converter> writeConverter() default NullConverter.class;

    /**
     * 读取数据类型转换器,POI数据类型转java类型
     * 
     * @return
     */
    @SuppressWarnings("rawtypes")
    public Class<? extends Converter> readConverter() default NullConverter.class;

}
